/*
 * Scanner.h
 *
 *  Created on: Apr 8, 2010
 *      Author: Stefan Obermeier
 */

#ifndef SCANNER_H_
#define SCANNER_H_

#include "../token/token.h"
#include "../buffer/buffer.h"
#include "../scanner/Automat1.h"

class Scanner {
	int zustand;
	int line;
	int column;	// Splate in der das Wort anfaengt
	int laengenZaehler; // Zaehlt die Anzahl der Zeichen eines Wortes oder Zeichen in einem Kommentar
	int anzahlLeerzeichen; // Anzahl der Leerzeichen am Wortende
	int columnBerechnet;	// Das an Token uebergeben wird
	token* ergebnisToken;
	char aktuellesZeichen;
	char* LexemSpeicher;
	long zahl;	// Der Wert des Integer Tokens
	bool wortZuEnde;	// true wenn das Wortende erkannt wurde
	bool inKommentar;   // true wenn das aktuelle Zeichen zu einem Kommentar gehoert
	bool neueZreile;
	Buffer* buffer;
	Automat1* automat;

	/*
	 * List so lange Zeichen bis ein Wortende erkannt wurde und spring zum ersten Zeichen des neuen Wortes.
	 * Gibt den Zustand des Automaten nach der Verarbeitung zurueck.
	 */
	int verarbeiteNextWord();
	/**
	 * Speichert die letzten n Zeichen in einem Array (n=laenge)
	 */
	void lexemSpeicher(int laenge);


	void signWortende();

	/**
	 * Inizialisiert die Variablen fuer den Beginn eines neuen Wortes.
	 */
	void z0Konfiguration();
	/*
	 * Berechnet den korrekten Wert fuer Column
	 */
	void berechneColumn();

public:

	/*
	 * Liest so lange Zeichen bis ein Token entstanden ist oder gebe null zurueck falls es kein Token gibt (Letzte Zeichen ist ein Kommentarende).
	 *
	 */
	token* nextToken();

	Scanner();
	Scanner(Buffer* buffer);
	virtual ~Scanner();
};

#endif /* SCANNER_H_ */
